#include <iostream>
#include <set>//底层是红黑树
using namespace std;

void test_1()
{
    set<int> s;//random number test
    s.insert(5);
    s.insert(1);
    s.insert(1);//值已经有了，就不会再插入//通过键值对绑定一个bool值来实现
    s.insert(1);
    s.insert(3);
    s.insert(2);
    s.insert(4);
    s.insert(6);
    set<int>::iterator it = s.begin();
    while(it!=s.end()) 
    {
        cout<<*it<<" ";
        it++;
    }
    cout<<endl;

    it = s.find(2);
    if(it!=s.end())
    {
        s.erase(it);
    }
    // s.erase(it);//给迭代器的话，删除的值不存在程序会直接崩溃

    cout<<s.erase(2);//直接erase，某个值，就算不存在，就会返回一些值。返回删除该值的个数
    cout<<endl;
    for(auto num:s)
    {
        cout<<num<<" ";
    }
    cout<<endl;
    return ;
}


void test_2()
{
    set<int> s;
    for(int i=0;i<10;i++){
        s.insert(i*10);
    }
    auto itlow = s.lower_bound(25);
    auto itup = s.upper_bound(70);//这里返回的是实际比70大的下一个值的迭代器
    // cout<<*itup<<endl;//这里打印的值就是80
    s.erase(itlow,itup);//删除这段区间的值,而且删除的是闭区间，
    for(auto num:s)
    {
        cout<<num<<" ";
    }
    cout<<endl;
}

void test_3()
{
    set<int> s;
    for(int i=0;i<10;i++){
        s.insert(i*10);
    }

    pair<set<int>::iterator,set<int>::iterator> ret = s.equal_range(20);//找到相等的值，返回相等的值开始及其下一个区间
    ret  =s.equal_range(35);//这里返回的是大于当前值的下一个值。
    cout<<*(ret.first)<<" "<<*(ret.second)<<endl;
}

void test_Mutiset()
{
    multiset<int> s;
    s.insert(5);
    s.insert(1);
    s.insert(2);
    s.insert(2);
    s.insert(2);
    s.insert(4);
    s.insert(6);
    auto it = s.find(2);
    while(it!=s.end()){
        cout<<*it<<' ';
        it++;
    }
    cout<<endl;

    cout<<s.erase(2)<<endl;//显示了成功删除的个数

    pair<multiset<int>::iterator,multiset<int>::iterator> ret = s.equal_range(2);//对于mutiset，就会返回set
    while(ret.first!=ret.second)
    {
        cout<<*ret.first;
        s.erase(ret.first++);
    }
    cout<<endl;
    return ;
}
// int main()
// {
//     test_Mutiset();
//     return 0;
// }